package org.mar.integer;

/**
 * 计算一个int转换成字符串后的长度
 */
public class IntStringSize {
    public static void main(String[] args) {
        assert stringSize(0) == 1;
        assert stringSize(1) == 1;
        assert stringSize(9) == 1;
        assert stringSize(10) == 2;
        assert stringSize(15) == 2;
        assert stringSize(-1) == 2;
        assert stringSize(-11) == 3;
        assert stringSize(Integer.MAX_VALUE) == 10;
        assert stringSize(Integer.MIN_VALUE) == 11;
    }

    /**
     * @see Integer stringSize(int)
     * @param x
     * @return
     */
    private static int stringSize(int x) {
        int d = 1;
        if (x >= 0) {
            // 是0或正数就要把d设置为0，d代表符号位，x是负数转换成字符串就要有个负号所以d=1
            d = 0;
            // 转成负数可以做统一处理，为什么不反过来把负数转成正数呢？因为负数表示的范围更大，比如把MIN_VALUE转成正数的话会超出范围溢出
            x = -x;
        }
        int p = -10;
        // int最大不会超过10位，所以这里是i<10
        for (int i = 1; i < 10; i++) {
            if (x > p) {
                return i + d;
            }
            p *= 10;
        }
        return 10 + d;
    }
}
